package cn.doitedu.day07

/**
 * 使用方法结合隐式参数，实现与视图界定、上下文界定一样的功能
 */
class Pair5[T] {

  //使用方法结合隐式参数，实现视图界定（必须传入隐式转换方法或函数）
  def bigger(first: T, second: T)(implicit ord: T => Ordered[T]): T = {
    if (first >= second) first else second
  }

  //使用方法结合隐式参数，实现上下文界定（上下文界定要传入隐式的类型）
  def bigger2(first: T, second: T)(implicit ord: Ordering[T]): T = {
    if (ord.gteq(first, second)) first else second
  }

}

object Pair5 {

  def main(args: Array[String]): Unit = {

    //    val m1 = new Man("tom", 99.99)
    //    val m2 = new Man("jerry", 98.99)
    //    val p = new Pair5[Man]
    //
    //    import MyPreDef2.manToOrderedMan
    //    val res = p.bigger(m1, m2)


    //    val g1 = new Girl("lili", 99.99)
    //    val g2 = new Girl("xinxin", 99.98)
    //
    //    val p5 = new Pair5[Girl]
    //    import MyPreDef2.OrderingGirl
    //    val res = p5.bigger2(g1, g2)


    val g1 = new Girl("lili", 99.99)
    val g2 = new Girl("xinxin", 99.98)
    import MyPreDef2.OrderingGirl
    val p5 = new Pair5[Girl]
    //对于bigger方法需要传入隐式转换方法或函数（implicit ord: T => Ordered[T]），
    // 但是Girl并没有相应的隐式转换方法或函数，只有一个object类型的 Ordering[Girl]
    // 实际上，将 Ordering[Girl] 转成了 Ordered[T]
    // 这个隐式转换方法在 object Ordered中定义了： implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] =
    val res = p5.bigger(g1, g2)


    println(res)
  }

}



